package main

import (
	"crypto/tls"
	"fmt"
	"log"
)

func main() {
	// 科恩坑：
	// (1)InsecureSkipVerify: true 用来控制客户端是否证书和服务器主机名，如果设置为true则不会校验。不要开它而应该用真实有效的证书，去阿里云随便买个域名，有20个免费的有效期为3个月的证书可以用。
	// (2)遇到这个错误的时候host一下然后用域名访问：tls: failed to verify certificate: x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs
	// (3)在本机测试时不要用默认的tls端口443，电脑上安装了vmware会占用这个端口，而且本机服务器端运行的时候不会给出任何提示。连结wmware占用的443会出现证书过期的错误。
	// (4)通常系统中已安装可信任的CA证书。如果没有自己下载CA证书导入一下。当前用的证书签发者（CN=我的域名 --> CN=Encryption Everywhere DV TLS CA - G2 --> CN=DigiCert Global Root G2 ）
	conf := &tls.Config{InsecureSkipVerify: false}
	var host string = "www.baidu.com:443" // 换成自己的域名
	conn, err := tls.Dial("tcp", host, conf)
	if err != nil {
		log.Println(err)
		return
	}

	// 打印证书链
	// if conn != nil {
	// 	certChain := conn.ConnectionState().PeerCertificates
	// 	for i, cert := range certChain {
	// 		fmt.Println(i)
	// 		fmt.Println("Issuer:", cert.Issuer)
	// 		fmt.Println("Subject:", cert.Subject)
	// 		fmt.Println("Version:", cert.Version)
	// 		fmt.Println("NotAfter:", cert.NotAfter)
	// 		fmt.Println("DNS name:", cert.DNSNames)
	// 		fmt.Println("")
	// 	}
	// }

	defer conn.Close()

	var http_request = `GET / HTTP/1.1\r\n
Host: www.baidu.com\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n
Accept-Language: en-US,en;q=0.8\r\n`

	n, err := conn.Write([]byte(http_request))
	if err != nil {
		log.Println(n, err)
		return
	}
	buf := make([]byte, 100)
	n, err = conn.Read(buf)
	if err != nil {
		log.Println(n, err)
		return
	}
	fmt.Println(string(buf[:n]))
}
